// od_children_queue 小朋友排队高矮高矮 ok
// https://blog.csdn.net/weixin_41010318/article/details/120876953
// od_children_queue_height_low.cpp
// 羊族的希望 于 2021-10-20 23:00:04 发布
// 现在有一队小朋友，他们高矮不同，我们以正整数数组表示这一队小朋友的身高，如数组{5,3,1,2,3}。
// 我们现在希望小朋友排队，以高矮高矮顺序排列，每一个“高”位置的小朋友要比相邻的位置高或者相等；
// 每一个“矮”位置的小朋友要比相邻的位置矮或者相等；要求小朋友们移动的距离和最小，第一个从“高”位开始排，
// 输出最小移动距离即可。例如，在示范小队{5,3,1,2,3}中，{5, 1, 3, 2,
// 3}是排序结果。 {5, 2, 3, 1, 3} 虽然也满足“高”“矮”“高”“矮”顺序排列，
// 但小朋友们的移动距离大，所以不是最优结果。移动距离的定义如下所示：
// 第二位小朋友移到第三位小朋友后面，移动距离为1，
// 若移动到第四位小朋友后面，移动距离为2；
// 输入排序前的小朋友，以英文空格的正整数：4 3 5 7 8 小朋友<100个
// 输出排序后的小朋友，以英文空格分割的正整数：4 3 7 5 8
// 备注：4（高）3（矮）7（高）5（矮）8（高），
// 输出结果为最小移动距离，只有5和7交换了位置，移动距离都是1.
// 输入 4 1 3 5 2
// 输出 4 1 5 2 3
// 输入 1 1 1 1 1
// 输出 1 1 1 1 1
// 说明：相邻位置可以相等
// 输入 xxx
// 输出 []
// 说明：出现非法参数情况，返回空数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void PrintSort(int *list, int n) {
  int i;
  for (i = 0; i < n; i++) {
    printf("%d ", list[i]);
  }
  printf("\n");
}
void GetSort(int *list, int n) {
  int i;
  if (n == 1) {
    printf("%d\n", list[0]);
  }
  for (i = 0; i < n - 1; i++) {
    if (i % 2 == 0 && list[i] < list[i + 1]) {
      Swap(&list[i], &list[i + 1]);
    }
    if (i % 2 == 1 && list[i] > list[i + 1]) {
      Swap(&list[i], &list[i + 1]);
    }
  }
}
int main() {
  char s[1000] = {0};
  int list[500] = {0};
  int idx = 0;
  gets(s);
  char *p = strtok(s, " ");
  while (p != NULL) {
    list[idx] = atoi(p);
    idx++;
    p = strtok(NULL, " ");
  }
  GetSort(list, idx);
  PrintSort(list, idx);
  return 0;
}